/*
 * argv.h
 */
/**
\ingroup lub
\defgroup lub_argv argv
@{

\brief This utility provides a simple means of manipulating a vector of 
command textual words.

A word is either separated by whitespace, or if quotes are used a word is
defined by the scope of the quotes.

e.g.
\verbatim
one two "this is the third word" four
\endverbatim
contains four "words" the third of which is a string.

*/
#ifndef _lub_argv_h
#define _lub_argv_h

#include <stddef.h>

#include "c_decl.h"
#include "types.h"

_BEGIN_C_DECL
/**
 * This type is used to reference an instance of an argument vector
 */
typedef struct lub_argv_s lub_argv_t;

/*=====================================
 * ARGV INTERFACE
 *===================================== */
/**
 * \pre
 * - none
 *
 * \return
 * The number of space separated words in the specified string.
 *
 * \post
 * - none
 */
unsigned lub_argv_wordcount(
	/**
         * The string to analyse
         */
	const char *line);
/**
 *  This operation is used to construct an instance of this class. The client
 * species a string and an offset within that string, from which to start
 * collecting "words" to place into the vector instance.
 *
 * \pre
 * - none
 *
 * \return
 * - A instance of an argument vector, which represents the words contained in
 * the provided string.
 * - NULL if there is insuffcient resource
 *
 * \post
 * - The client becomes resposible for releasing the instance when they are
 *   finished with it, by calling lub_argv_delete()
 */
lub_argv_t *lub_argv_new(
	/**
         * The string to analyse
         */
	const char *line,
	/**
         * The offset in the string to start from
         */
	size_t offset);

void lub_argv_delete(lub_argv_t * instance);
unsigned lub_argv__get_count(const lub_argv_t * instance);
const char *lub_argv__get_arg(const lub_argv_t * instance, unsigned index);
size_t lub_argv__get_offset(const lub_argv_t * instance, unsigned index);
bool_t lub_argv__get_quoted(const lub_argv_t * instance, unsigned index);
void lub_argv__set_arg(lub_argv_t * instance, unsigned index, const char *arg);
char **lub_argv__get_argv(const lub_argv_t * instance, const char *argv0);
void lub_argv__free_argv(char **argv);
char *lub_argv__get_line(const lub_argv_t * instance);
void lub_argv_add(lub_argv_t * instance, const char *text);

_END_C_DECL
#endif				/* _lub_argv_h */
/** @} lub_argv */
